home *** CD-ROM | disk | FTP | other *** search
- 0660000020266
- 1
- 2Seite #
- 9[.........................................................]
- Seite54TracerundDecompiler
-
- DasKapitel'7.2)DerTracer'vonSeite54istdurchfolgendeszu
- ersetzen:
-
- Angenommen,SiewollenfolgendesWortaufFehleruntersuchen:
- (bittetippenSieein,allenötigenEingabensindüfettÇundalle
- AusgabendesvolksFORTH83sindêunterstrichenÇdargestellt.)
-
- ü:-trailingÇ(addr1n1--addr1n2)êcompiling
- ü2dupbounds?DO2dup+1-c@bl=êcompiling
- üIFLEAVETHEN1-LOOP;êok
- Ç
- DieFunktiondiesesWorteskönnenSie,wennsieIhnenunklarist,
- demGlossarentnehmen.ZumTestendesWorteswirdeinString
- benötigt.Siedefinieren:
-
- üCreateteststring,"DiesisteinTest "êok
- Ç
- wobeiSiebitteabsichtlicheinigezusätzlicheLeerzeichen
- eingefügthaben.Siegebennunein:
-
- üteststringcount.sê167E39ok
- ü-trailing.sê167E39ok
- Ç
- undstellenzuIhremErstaunenfest,daß-TRAILINGkeineinziges
- Leerzeichenabgeschnittenhat.(SpätestensjetztsolltenSieam
- RechnersitzenunddenTracerladen,wennernochnichtimSystem
- vorhandenist.PrüfenSie,obesdasWortDEBUGimFORTH
- Vocabularygibt,dannistderTracervorhanden.DerTracergehört
- zudensogenanntenTools.DieQuelltextefindenSieaufIhrer
- Diskette(SehenSiebitteimDirectorynach)).
-
- MitdemTracerkönnenSieWorte,diemitdem:definiertwurden,
- imEinzelschrittbetriebtesten.UmdenTracerzubenutzen,geben
- Siefolgendesein:
-
- üdebug<name1>êok
- Ç
- Hierbeiist<name1>daszutracendeWort.Zunächstgeschiehtnoch
- garnichts.DEBUGhatnurdenTracer"scharfgemacht".GebenSie
- nuneineSequenzein,die<name1>enthält,unterbrichtderTracer
- dieAusführung,wennerauf<name1>stößt.Eserscheintfolgendes
- Bild.
-
- êaddr1addr2<name2> (Werte)
- Ç
- ♪⑤Hierbeiistaddr1eineAdresseimParameterfeldvon<name1>,
- nämlichdie,inderaddr2steht.addr2istdieKompilations-
- Adressevon<name2>.<name2>istdasWort,dasalsnächstes
- ausgeführtwerdensoll.(Werte)sinddieWerte,diegeradeaufdem
- Stackliegen.
-
- ♪±BleibenwirbeiunseremBeispiel,Siegebenein:
-
- üdebug-trailingêok
- Ç
- Esgeschiehtzunächstnichts.
-
- NunversuchenSieeswiedermitderSequenz
-
- üteststringcount.sê167E39ok
- ü-trailing
- Ç
- underhaltenfolgendesBild:
-
- ê7E045362DUP 167E39
- Ç
- ♪③167E39istderStackinhalt,wieervonTESTSTRINGCOUNT
- geliefertwurde,nämlichAdresseundLängedesStrings
- TESTSTRING .
-
- NatürlichkönnendieZahlenbeiIhnenandersaussehen,jenachdem,
- wohinTESTSTRINGund -TRAILING kompiliertwurde.536istdie
- Kompilations-Adressevon2DUP,7E04diePositionvon2DUPin
- -TRAILING.(AuchdieseAdressenkönnnensichgeänderthaben!)
-
- DrückenSiejetztsolange<Return>,bisOKausgegebenwird.Es
- ergibtsichfolgendeGesamtausgabe:
-
- üdebug-trailingteststringcount.sê167E39ok
- ü-trailing
- ê7E045362DUP 167E39
- 7E06954BOUNDS 167E39167E39
- 7E0892C(?DO 7E397E4F167E39
- 7E0C5362DUP 167E39
- 7E0E546+ 167E39167E39
- 7E1064C1- 7E4F167E39
- 7E1234EC@ 7E4E167E39
- 7E14215CBL 20167E39
- 7E16816= 2020167E39
- 7E18A0C?BRANCH FFFF167E39
- 7E1CBE2LEAVE 167E39
- 7E242F4 UNNEST 167E39ok
- Ç
- SehenwirunsdieAusgabenunetwasgenaueran.Beidenersten
- beidenZeilenwächstderWertganzlinksimmerum2.Esistder
- InhaltdesInstructionpointers(IP),derimmeraufdienächste
- auszuführendeAdressezeigt.DerInhaltdieserAdresseistjeweils
- eineKompilations-Adresse( 536bei2DUPusw.).JedeKompilations-
- AdressebenötigtzweiBytes,dahermußderIPimmerum2erhöht
- werden.
-
- ♪Immer?Nein,dennschondienächsteZeilezeigteineAusnahme.Das
- Wort(?DOerhöhtdenIPum4!Woherkommteigentlich(?DO ,in
- derDefinitionvon-TRAILINGstanddochnur?DO.(?DOistein
- von?DOkompiliertesWort,daszusätzlichzurKompilations-
- Adressenocheinen16-Bit-Wertbenötigt,nämlichfürden
- SprungoffsethinterLOOP,wenndieSchleifebeendetist.Zwei
- ähnlicheFälletretennochauf.DasIFausdemQuelltexthatein
- ?BRANCHkompiliert.Eswirdgesprungen,wennderoberste
- StackwertFALSE( =0)ist.Auch?BRANCHbenötigteinen
- zusätzlichen16-Bit-WertfürdenSprungoffset.
-
- ♪·NachLEAVEgehteshinterLOOPweiter,eswirdUNNEST
- ausgeführt,dasvom ; in-TRAILINGkompiliertwurdeunddas
- gleichewieEXITbewirkt,unddamitistdasWort-TRAILINGauch
- beendet.DashiergelisteteWortUNNESTistnichtzuverwechseln
- mitdemUNNESTdesTracers(sieheunten).
-
- WoliegtnunderFehlerinunsererDefinitionvon-TRAILING?
- BevorSieweiterlesen,solltenSiedieFehlerbeschreibung,den
- TracelaufundIhreVorstellungvonderkorrektenArbeitsweisedes
- WortesnocheinmalunterdieLupenehmen.
-
- DerStackistvorundnach-TRAILINGgleichgeblieben,dieLänge
- desStringsalsonichtverändertworden.Offensichtlichwirddie
- SchleifegleichbeimerstenMalverlassen,obwohldasletzte
- ZeichendesTexteseinLeerzeichenwar.DieSchleifehättealso
- eigentlichmitdemvorletztenZeichenweitermachenmüssen.Mit
- anderenWorten:
-
- DieAbbruchbedingunginderSchleifeistfalsch.Sieistgenau
- verkehrtherumgewählt.Ersetztman=durch= NOT oder-,so
- funktioniertdasWortkorrekt.ÜberlegenSiebitte,warum-
- statt= NOT eingesetztwerdenkann.(Tip:derIF-Zweigwird
- nichtausgeführt,wennderobersteStackwertFALSE(also=0)
- ist.)
-
-
- DervolksFORTH83-Tracergestattetes,jederzeitBefehle
- einzugeben,dievordemAbarbeitendesnächstenTrace-Kommandos
- ausgeführtwerden.Damitkannmanz.B.Stack-Werteverändernoder
- dasTracenabbrechen.ÄndernSieprobehalberbeimnächstenTrace-
- Laufvon-TRAILINGdasTRUE-Flag($FFFF)aufdemStackvorder
- Ausführungvon?BRANCHdurchEingabevonNOT auf0undverfolgen
- SiedenweiterenTrace-Lauf.Siewerdenbemerken,daßdieLOOPein
- zweitesMaldurchlaufenwird.
-
- WollenSiedasTracenunddieweitereAusführungdesgetraceten
- Wortesabbrechen,sogebenSiebitteRESTARTein.RESTARTführt
- einenWarm-StartdesFORTH-SystemsausundschaltetdenTracerab.
- RESTARTistauchdieNotbremse,wennmandieKatastrophevorAugen
- hat,weilmansieht,daßdasSystemmitdemnächstenBefehl
- zwangsläufigimComputer-Nirwanaentschwindenwird.
-
- ♪⑥NützlichistauchdieMöglichkeit,dasWort,dasalsnächsteszur
- Ausführungansteht,solangezutracen,bisesinsaufrufendeWort
- zurückkehrt.DafüristdasWortNESTvorgesehen.WollenSiealso
- wissen,wasBOUNDSmacht,sogebenSiebitte,wennBOUNDSals
- nächstesauszuführendesWortangezeigtwird,NESTeinundSie
- erhaltendann:
-
- ê7E045362DUP 167E39
- 7E06954BOUNDS 167E39167E39 ünest
- ê 95644COVER 167E39167E39
- 958546+ 7E39167E39167E39
- 95A40ASWAP 7E4F7E39167E39
- 95C 2F4 UNNEST 7E397E4F167E39
- 7E0892C(?DO 7E397E4F167E39
- Ç...
-
- BeachtenSiebitte,daßdieZeilenjetzteingerücktdargestellt
- werden,bisderTracerautomatischindasaufrufendeWort
- zurückkehrt.DerGebrauchvonNESTistnurdadurcheingeschränkt,
- daßsicheinigeWorte,diedenReturn-Stackmanipulieren,mitNEST
- nichttracenlassen,daderTracerselbstGebrauchvomReturn-
- Stackmacht.AufsolcheWortemußmandenTracermitDEBUG
- ansetzen.
-
- WollenSiedasTraceneinesWortesbeenden,ohnedieAusführung
- desWortesabzubrechen,sobenutzenSiebitteUNNEST.(Istder
- Tracergeladen,sokommenSieandastiefimSystemsteckende
- UNNEST,einemSynonymfürEXIT,dasausschließlichvom ;
- kompiliertwird,nichtmehrheranundbenutzenstattdessendas
- Tracer-UNNEST,dasSieeineEbeneimTrace-Laufzurückbringt.)
-
- ManchmalhatmanineinemWortvorkommendeSchleifenbeimersten
- Durchlaufalskorrekterkanntundmöchtediesenichtweiter
- tracen.DaskannsowohlbeiDO...LOOPsderFallseinalsauchbei
- KonstruktionenmitBEGIN...WHILE...REPEAToderBEGIN...UNTIL.In
- diesenFällengibtmanamEndederSchleifedasWortüENDLOOPÇein.
- DieSchleifewirddanninEchtzeitabgearbeitet.
-
- HabenSiedenFehlergefundenundwollendeshalbnichtmehr
- tracen,somüssenSienachdemEndedesTracensEND-TRACEoder
- jederzeitRESTARTeingeben,ansonstenbleibtderTracer"scharf",
- waszumerkwürdigenErscheinungenführenkann;außerdemverringert
- sichbeieingeschaltetemTracerdieLaufzeitdesSystems.
-
- ♪⑨DerTracerläßtsichauchmitdemWortTRACE'starten,das
- seinerseitseinzutracendesForth-Worterwartet.Siekönntenalso
- auchimobigenBeispieleingeben:
-
- üteststringcounttrace'-trailingÇ
-
- undhättendamitdieselbeWirkungerzielt.TRACE'schaltetaberim
- GegensatzzuDEBUGnachDurchlaufdesWortesdenTracer
- automatischmitEND-TRACEwiederab.
-
- ♪⑤BeachtenSiebitteauch,daßdieWorteDEBUGundTRACE'das
- VokabularTOOLSmitindieSuchreihenfolgeaufnehmen.Siesollten
- alsonach-hoffentlicherfolgreichem-TracelaufdieSuchordnung
- wiederumschalten.
-
- Wennmansicheingearbeitethat,istderTracereinwirklich
- verblüffendesWerkzeug,mitdemmansehrvieleFehlerschnell
- findenkann.EristgleichsameinMikroskop,mitdemmansehrtief
- insInnerevonForthschauenkann.
-
-
-
- üDerDecompilerÇ
-
- EinDecompilergehörtsozusagenzumgutenToneinesFORTH-
- Systems,warerbisherdochdieeinzigeMöglichkeit,wenigstens
- ungefährdenAufbaueinesSystemszudurchschauen.BeivolksFORTH-
- 83istdasanders,undzwarauszweiGründen:
-
- -SiehabensämtlicheQuelltextevorliegen,undesgibtdie
- VIEW-Funktion.Letztereistnormalerweisesinnvolleralsder
- besteDecompiler,dakeinDecompilerinderLageist,z.B.
- Stackkommentarezurekonstruieren.
-
- -DerTraceristbeimDebuggingsehrvielhilfreicheralsein
- Decompiler,daerauchdieVerarbeitungvonStackwerten
- erkennenläßt.DamitsindFehlerleichtaufzufinden.
-
- DennochgibtesnatürlichauchimvolksFORTHeinenDecompiler,
- allerdingsineinfacher,vonHandzubedienender,Form.Er
- befindetsich,wiederTracer,imVocabularyTOOLS.FolgendeWorte
- stehenzurVerfügung.
-
- N(name)(addr--addr')
- drucktdenNamendesbeiaddrkompiliertenWortesausund
- setztaddraufdasnächsteWort.
-
- K(konstante)(addr--addr')
- wirdnachLITbenutztunddrucktdenInhaltvonaddralsZahl
- aus.Eswirdalsonichtversucht,denInhalt,wiebeiN,als
- Forthwortzuinterpretieren.
-
- S(string)(addr--addr')
- wirdnach(ABORT"("(."undallenanderenWortenbenutzt,
- aufdieeinStringfolgt.DerStringwirdausgedrucktund
- addrentsprechenderhöht,sodaßsiehinterdenStringzeigt.
-
- C(character)(addr--addr')
- drucktdenInhaltvonaddralsAscii-Zeichenausundgehtein
- Byteweiter.DamitkannmaneigeneDatenstrukturenansehen.
-
- B(branch)(addr--addr')
- wirdnachBRANCHoder?BRANCHbenutztunddrucktdenInhalt
- einerAdressealsSprungoffsetundSprungzielaus.
-
- D(dump)(addrn--addr')
- DumpednBytes.Wirdbenutzt,umselbstdefinierte
- Datenstrukturenanzusehen.(s.a.DUMPundLDUMP)
-
- SehenwirunsnuneinBeispielzurBenutzungdesDecompilersan.
- GebenSiebittefolgendeDefinitionein:
-
- :test(n--)
- 12=IFcr."DieZahlistzwölf!"THEN;
-
- RufenSiedasVocabularyTOOLS-durchNennenseinesNamensauf
- undermittelnSiedieAdressedesersteninTESTkompilierten
- Wortes:
-
- 'test>body
-
- JetztkönnenSieTESTnachfolgendemMusterdecompilieren
- (UnterstrichensindIhreEingaben.)
-
- ênÇA988:B54LITok
- êkÇA98A:12ok
- ênÇA98C:C52=ok
- ênÇA98E:E74?BRANCHok
- êbÇA990:1AA9AAok
- ênÇA992:32BCCRok
- ênÇA994:1776(."ok
- êsÇA996:12DieZahlistzwölfok
- ênÇA99A:416UNNEST
- êdropÇ
-
- DieersteAdresseistdie,anderimWortTESTdieanderenWorte
- kompiliertsind.DiezweiteistjeweilsdieKompilationsadresse
- derWorte,danchfolgendiesonstigenAusgabendesDecompilers.
-
- ProbierenSiediesesBeispielauchmitdemTraceraus:
-
- 20trace'test
-
- undachtenSieaufdieUnterschiede.Siewerdensehen,daßder
- Traceraussagefähigerunddazunocheinfacherzubedienenist.
-
-